home *** CD-ROM | disk | FTP | other *** search
/ Ham Radio 2000 #1 / Ham Radio 2000.iso / ham2000 / packet / p_aa4re / bb212src / bbmore.pas < prev    next >
Encoding:
Pascal/Delphi Source File  |  1992-03-22  |  5.3 KB  |  221 lines

  1. (*===========================================================================*)
  2. (* Handle more                                                               *)
  3. (*                                                                           *)
  4. (*   Copyright 1990, 1992 by H. Roy Engehausen.  All rights reserved.        *)
  5. (*                                                                           *)
  6. (*===========================================================================*)
  7.  
  8. UNIT BBMORE;
  9.  
  10. INTERFACE
  11.  
  12. PROCEDURE more_clear;
  13. FUNCTION  more_prompt      : BOOLEAN;
  14. FUNCTION  more_check       : BOOLEAN;
  15. PROCEDURE more_add_lines   (lines_out: BYTE);
  16. FUNCTION  more_check_lines (lines_out: BYTE) : BOOLEAN;
  17. PROCEDURE more_add_str     (VAR in_str : STRING);
  18. FUNCTION  more_check_str   (VAR in_str : STRING) : BOOLEAN;
  19.  
  20. IMPLEMENTATION
  21.  
  22. USES
  23.   DOS,
  24.   bbdummy,
  25.   bbmdata,
  26.   bbmess,
  27.   bbrdata,
  28.   bbstr,
  29.   bbtrace;
  30.  
  31. {$UNDEF  DEBUG1}
  32.  
  33. (*===========================================================================*)
  34. (* Clear more counters                                                       *)
  35. (*===========================================================================*)
  36.  
  37. PROCEDURE more_clear;
  38.   BEGIN
  39.  
  40.     active_tcb^.out_char := 0;
  41.     active_tcb^.out_line := 0;
  42.  
  43.   END;
  44.  
  45. FUNCTION more_prompt : BOOLEAN;
  46.  
  47.   VAR
  48.     in_str : str2;
  49.  
  50.   BEGIN;
  51.  
  52.     send_message(message_more_prompt);
  53.  
  54.     in_str := read_tnc_data_str;
  55.  
  56.     strip_crlf(in_str);
  57.  
  58.     send_message(message_more_done);
  59.  
  60.     IF LENGTH(in_str) > 0 THEN
  61.       BEGIN
  62.         send_message(message_op_halted);
  63.         more_prompt := TRUE;
  64.       END
  65.     ELSE
  66.       more_prompt := FALSE;
  67.  
  68.   END;
  69.  
  70. (*===========================================================================*)
  71. (* Do the actual check                                                       *)
  72. (*===========================================================================*)
  73.  
  74. FUNCTION  more_check : BOOLEAN;
  75.  
  76.   BEGIN;
  77.  
  78.     more_check  := FALSE;
  79.  
  80.     WITH active_tcb^ DO
  81.       BEGIN;
  82.  
  83.         {$IFDEF DEBUG1}
  84.            STR(uid_data.user_scr_len, in_str);
  85.            trace_data('MRC', out_line, NIL, in_str);
  86.         {$ENDIF}
  87.  
  88.         IF (uid_data.user_scr_len = 0)
  89.                                     OR (out_line < uid_data.user_scr_len) THEN
  90.           EXIT;
  91.  
  92.         out_char := 0;
  93.         out_line := 0;
  94.  
  95.       END;
  96.  
  97.     more_check := more_prompt;
  98.  
  99.   END;
  100.  
  101. (*===========================================================================*)
  102. (* Handle the MORE function.                                                 *)
  103. (*===========================================================================*)
  104.  
  105. PROCEDURE more_add_lines(lines_out: BYTE);
  106.  
  107.   VAR
  108.     i : INTEGER;
  109.  
  110.   BEGIN;
  111.  
  112.     WITH active_tcb^ DO
  113.       BEGIN;
  114.  
  115.         IF (uid_data.user_scr_len = 0) AND NOT out_force THEN
  116.           EXIT;
  117.  
  118.         i := out_line + lines_out;
  119.  
  120.         IF i > 255 THEN
  121.           out_line := 255
  122.         ELSE
  123.           out_line := i;
  124.  
  125.       END;
  126.  
  127.   END;
  128.  
  129. (*===========================================================================*)
  130. (* Handle the MORE function.                                                 *)
  131. (*===========================================================================*)
  132.  
  133. FUNCTION  more_check_lines(lines_out: BYTE) : BOOLEAN;
  134.  
  135.   BEGIN;
  136.  
  137.     more_add_lines(lines_out);
  138.  
  139.     more_check_lines := more_check;
  140.  
  141.   END;
  142.  
  143. (*===========================================================================*)
  144. (* Handle the MORE function. in_str is a variable to save stack space        *)
  145. (*===========================================================================*)
  146.  
  147. PROCEDURE more_add_str(VAR in_str : STRING);
  148.  
  149.   VAR
  150.     count_chars : BOOLEAN;
  151.     i           : BYTE;
  152.     char_cnt    : WORD;
  153.     line_cnt    : BYTE;
  154.  
  155.   BEGIN;
  156.  
  157.     WITH active_tcb^ DO
  158.       BEGIN;
  159.  
  160.         IF (uid_data.user_scr_len = 0) AND NOT out_force THEN
  161.           EXIT;
  162.  
  163.         count_chars := uid_data.user_scr_wid <> 0;
  164.  
  165.         char_cnt := out_char;
  166.         line_cnt := 0;
  167.  
  168.         {$IFDEF DEBUG1}
  169.            trace_data('MRX', char_cnt, NIL, '');
  170.         {$ENDIF}
  171.  
  172.         FOR i := 1 TO LENGTH(in_str) DO
  173.           BEGIN;
  174.  
  175.             INC(char_cnt);
  176.  
  177.             IF (count_chars AND (char_cnt >= uid_data.user_scr_wid))
  178.                                                        OR (in_str[i] = cr) THEN
  179.               BEGIN;
  180.  
  181.                 {$IFDEF DEBUG1}
  182.                    trace_data('MRY', ORD(in_str[i]), NIL, '');
  183.                    trace_data('MRZ', char_cnt, NIL, '');
  184.                 {$ENDIF}
  185.  
  186.                 INC(line_cnt);
  187.                 char_cnt := 0;
  188.               END;
  189.  
  190.           END;
  191.  
  192.         IF count_chars THEN
  193.           out_char := char_cnt;
  194.  
  195.         more_add_lines(line_cnt);
  196.  
  197.         {$IFDEF DEBUG1}
  198.            trace_data('MRA', line_cnt, NIL, '');
  199.            trace_data('MRB', out_line, NIL, '');
  200.         {$ENDIF}
  201.  
  202.       END;
  203.  
  204.   END;
  205.  
  206. (*===========================================================================*)
  207. (* Handle the MORE function. in_str is a variable to save stack space        *)
  208. (*===========================================================================*)
  209.  
  210. FUNCTION more_check_str(VAR in_str : STRING) : BOOLEAN;
  211.  
  212.   BEGIN;
  213.  
  214.     more_add_str(in_str);
  215.  
  216.     more_check_str := more_check;
  217.  
  218.   END;
  219.  
  220. END.
  221.